查看原文
其他

Taichi v1.0.0 发布,不止于 Python

太极图形 2023-03-21

2022 年 4 月 13 日,Taichi v1.0.0 发布。该版本公布的兼容性变更包括:开源许可证变更为 Apache-2.0、支持 Python 3.10、适配 manylinux2014 安装包。新功能包括:脱离 Python 的部署方案、非内联函数(试验功能)、字面量的类型标注、顶层 for 循环的行为控制、math 模块、新命令 ti gallery。重要改进包括:加强的矩阵类型、更灵活的自动微分系统、assert 语句中的格式化字符串支持。文档变更包括新版的 Taichi 语言规范。


兼容性变更


开源许可证变更

经过在 #4607[1] 的公开投票,Taichi 使用的开源许可证从 MIT 变更到 Apache-2.0。


支持 Python 3.10 

此版本增加了对 Python 3.10 的支持(Windows、macOS 与 Linux)。


适配 manylinux2014 的安装包

之前 Taichi 只支持拥有 glibc 2.27 以上版本的 Linux 发行版(如 Ubuntu 18.04 以上)。自 v1.0.0 起,Taichi 额外提供了适配 manylinux2014 的安装包,使其能在包括 CentOS 7 在内的绝大部分现代 Linux 发行版上运行。需要注意的是,该适配版本仅包含 CPU 和 CUDA 两个后端。


弃用声明

自此版本起,Taichi 将废弃 ti.ext_arr() 接口,改用 ti.types.ndarray()。后者同时支持 Taichi Ndarray 与外部数组(如 NumPy 数组)。 


Taichi 考虑在 v1.1.0 时停止对 Python 3.6 的支持。如有疑问,可参与 GitHub Discussion 上对此的讨论 #4772[2]。 


新功能


脱离 Python 的部署方案

Taichi 在 v1.0.0 中发布了与 OPPO US Research Center 联合开发的将 Taichi 部署到如移动端设备等脱离 Python 运行时环境的部署方案 Taichi AOT。 


该方案允许用户在 Python 环境中将编译好的各种 Taichi kernel 存储下来,并且提供了一个 C++ 运行时库来方便地加载和运行它们。该 C++ 运行时提供了一系列 API 方便用户的 Python Taichi 程序部署到 C++ 的环境中。为了验证该部署方案的易用性,我们将 v0.9.0 中最新发布的隐式有限元 (Implicit FEM)的示例部署到了一个安卓程序中。阅读原文前往 GitHub 的 release notes 下载 apk 文件[3] 试玩 Taichi AOT 的示例或了解 C++ 运行时的 API,也可以访问社区 [4] 查看样例程序!


用 Taichi 模拟的弹性“怪兽”在安卓上实现交互功能


PS. 我们在开发安卓 app 的过程中遇到了一个有趣的可能和安卓系统资源调度相关的性能问题,非常欢迎各路大神一起探讨。详情请访问 #16 [5],同时欢迎大家扫码体验 Taichi AOT ( 在手机上玩起来~ 需安卓 10 以上机型)。



非内联函数(试验功能)

现有的 Taichi 函数 (@ti.func) 会在编译期被内联到 kernel 中。然而,如果一个 kernel 调用了过多的 Taichi 函数,内联结束后这个 kernel 会变得非常长,导致编译很慢。这个问题在涉及编译期递归的 Taichi 函数上变得尤其严重。


Taichi v1.0.0 推出了试验功能:非内联函数 (@ti.experimental.real_func) 。非内联函数会被独立编译,而不会像现有的 Taichi 函数一样被内联。因此,上面提到的编译时间问题将得到极大的改善。目前,非内联函数只支持标量数据类型作为参数和返回值。


非内联函数和现有 Taichi 函数的主要区别包括:

  • 在非内联函数的任意位置都可以写 return 语句,而在现有 Taichi 函数中不能在 static 的 if/for/while 语句内写 return 语句;

  • 非内联函数可以在运行时递归调用,而现有 Taichi 函数只支持编译期递归;

  • 非内联函数的参数和返回值必须有类型标注,而他们在现有 Taichi 函数中是可选的。 


字面量的类型标注

Taichi 此前不支持为字面量标注类型,因此使用某些字面量(如 2891336453)时会因为字面量超出了默认整数类型(ti.i32)的范围而报错。v1.0.0 加入了字面量的类型标注功能,例如可以使用 ti.u32(2891336453) 为上面的字面量指定类型 ti.u32。


顶层 for 循环的行为控制

可以使用 ti.loop_config() 控制其紧接着的一个顶层 for循环行为,目前支持的参数包括:

  • block_dim:设置 GPU 一个 block 的线程数量。 

  • parallelize:设置 CPU 使用的线程数量。 

  • serialize:设置 serialize=True与设置 parallelize=1 等价,表示 for 循环顺序执行,可以在其中写 break 语句(仅对 range / ndrangefor 有效)。 


math 模块

增加了一个新的 math 模块,支持 GLSL 风格的向量和矩阵类型(如vec2, vec3, vec4, mat2, mat3 以及 mat4),GLSL 风格的向量访问方式(如rgba, xyzw, uvw),以及常用的GLSL 函数(如 mix(), clamp(), smoothstep() )。这样用户可以很方便地将 shader 代码转换为 Taichi 代码。


新命令 ti gallery

v1.0.0 提供了一个新命令 ti gallery ,方便让用户在一个交互式的窗口中查看和运行 Taichi 的 demo 程序:


经典 demo 合集


用户可以使用鼠标选择想查看的 demo,随后程序会自动运行对应的 demo 并打印对应的源代码。


改进


加强的矩阵类型

Taichi v1.0.0 支持 Matrix 或者 Vector 作为 kernel 的参数类型和返回值类型,其类型标识分别为 ti.types.matrix 或者 ti.types.vector。


同时,Taichi 还支持了只读的切片操作,使用像 mat[:,:] 的语法从矩阵中快速获得需要的部分。需要注意的是,切片的上下界和步长需要是常数。如果想和变量下标一起使用,则需要设置 ti.init(dynamic_index=True)。


更灵活的自动微分系统

此前,Taichi 只支持对包含简单嵌套 for 循环的 kernel 进行自动微分。自 v1.0.0 起,该限制被移除,包含复杂结构循环的代码也支持自动微分,用户可以更为灵活地编写可微分代码。


同时,Taichi 提供了一个新 demo #4769 [6] 来展示如何用解除限制后的自动微分系统写一个可微分的物理仿真程序。


用 Taichi autodiff 训练喷泉使用最小力击中目标


assert 语句中的格式化字符串支持

Taichi v1.0.0 支持让 assert 语句接收一个 f-string 作为错误信息。


文档变更


Taichi 语言规范

v1.0.0 正式推出了 Taichi 初版语言规范 [7],目的是尽可能全面描述 Taichi 语言的语法和语义,使得用户和开发者在判断语言行为是否正确时能有一个权威的参考标准。


点击阅读原文前往 GitHub 查看更详细的新功能说明以及代码示例!


快来体验一键安装新版 Taichi Lang👇

python3 -m pip install taichi --upgrade


并运行 taichi gallery👇

python3 -m taichi gallery


References:

[1] https://github.com/taichi-dev/taichi/issues/4607

[2] https://github.com/taichi-dev/taichi/discussions/4772

[3] https://github.com/taichi-dev/taichi/releases/download/v1.0.0/TaichiAOT.apk

[4] https://github.com/taichi-dev/taichi-aot-demo  

[5] https://github.com/taichi-dev/taichi-aot-demo/issues/16

[6] https://github.com/taichi-dev/taichi/blob/master/python/taichi/examples/autodiff/diff_sph/diff_sph.py

[7] https://docs.taichi-lang.org/lang/articles/reference

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存